package cn.itcast.zt.handlers;

import cn.itcast.zt.domain.User;
import cn.itcast.zt.repository.UserRepository;
import cn.itcast.zt.util.CheckUtil;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

/**
 * created by zhangtian on 2018/7/9
 */
@Component
public class UserHandler {
    private final UserRepository userRepository ;

    public UserHandler(UserRepository userRepository) {
        this.userRepository = userRepository ;
    }

    /**
     * 得到所有用户
     * @param request
     * @return
     */
    public Mono<ServerResponse> getAllUser(ServerRequest request){
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(this.userRepository.findAll(), User.class) ;
    }

    /**
     * 创建用户
     * @param request
     * @return
     */
    public Mono<ServerResponse> createUser(ServerRequest request){
        // 下面的方式可以直接获取User，但是会阻塞线程
        // 2.0.0版本是可以工作的，但是在2.0.1+下面这个模式是会报异常
        // User user = request.bodyToMono(User.class).block() ;

        Mono<User> user = request.bodyToMono(User.class) ;

        // Mono/Flux都是一个流，由Springboot框架消费，任何时候不能调用它的subscript方法
        // flatMap也不是最终操作，返回的仍然是一个流
        return  user.flatMap(u->{
            // 校验代码需要放在这里
            CheckUtil.checkName(u.getName());
            return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8)
                    .body(this.userRepository.save(u), User.class) ;
        }) ;

        /*return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(this.userRepository.saveAll(user), User.class) ;*/
    }

    /**
     * 根据ID删除用户
     * @param request
     * @return
     */
    public Mono<ServerResponse> deleteUserById(ServerRequest request){
        String id = request.pathVariable("id") ;

        return this.userRepository.findById(id)
                .flatMap(user -> this.userRepository
                        .delete(user)
                        .then(ServerResponse.ok().build()))
                .switchIfEmpty(ServerResponse.notFound().build());
    }
}
